// 先序线索化

// 全局变量 指向当前节点前驱
# define NULL 0
ThreadNode *pre = NULL;

// 先序线索化 二叉树
void CreatePreThread(ThreadTree T)
{
    pre = NULL;
    if(T!=NULL)
    {
        PreThread(T);
        if(pre->rchild==NULL)
        {
            pre->rtag==1;   // 处理遍历的最后一个节点
        }
    
    }
}
// 一边先序遍历 一边线索化
void PreThread(ThreadTree T)
{
    if(T!=NULL)
    {
        visit(T);
        if (T->ltag==0)   // 只遍历访问真左孩子 防止兜圈
        {
            PreThread(T->lchild);
        }
        
        PreThread(T->rchild);
    }
    
}

void visit(ThreadNode *q)
{
    if(q->lchild==NULL) // 左子树空  建立前驱线索
    {
        q->lchild = pre;
        q->ltag = 1;
    }
    if(pre!=NULL && pre->right == NULL)  // 前驱右子树空  建立前驱的后继线索
    {
        pre->right = q;
        pre->rtag = 1;
    }
    pre = q;
}



